<?php
define( "MICROTIME" ,  microtime( TRUE ) );
header( "Use-Compress:1" );
header( "Cache-Control:no-cache, must-revalidate" );
header( "Expires:Sat, 26 Jul 1997 05:00:00 GMT" );
define( "ROOT_DIR" , dirname( __FILE__ ) . "/..");
define( "CONFIG_DIR" , ROOT_DIR . "/Config/" );
define( "CORE_DIR" , ROOT_DIR ."/Core/" );
define( "MOD_DIR" , ROOT_DIR ."/Model/" );
define( "CON_DIR" , ROOT_DIR ."/Controller/" );
define( "TPL_DIR" , ROOT_DIR ."/Tpl/" );
define( "THIRD_DIR" , ROOT_DIR . "/Third/" );

//载入核心文件
include CORE_DIR .'Common.php';

$config = Common::getConfig();

//DEBUG模式 - 能直接设定用户ID和DATA数据 且PHP会报错
define( 'DEBUG' , $config['debug'] );

//入口
Application::main();

/**
 * 应用入口类
 *
 * @author Leo
 */
class Application
{
    /**
     * API入口, 包括全局信息
     *
     * @param string    $con    controller参数，GET方式传递
     * @param string    $act    act参数，GET方式传递
     * @param int       $uId    用户id，GET方式传递（登录、注册接口不需要）
     * @param string    $token  token信息，GET方式传递（登录、注册接口不需要）
     * @param array     $data   接口中所有其他参数，POST方式传递（开发环境中可GET方式传递）
     * @return array
     * <pre>
     *  array(
     *      result:int          API执行结果（非0代表错误）
     *      msg:string          错误信息
     *      method:string       接口名称
     *      data:array(         接口返回信息
     *      )
     *  )
     * </pre>
     *
     * @author Leo
     * @since 2012.2.28
     */
    public static function main()
    {
        try
        {
            self::ini();

            $r = self::run( 1 );

            self::jsonOut( $r['result'] , $r['msg'] , $r['method'] , $r['data'] );
        }
        catch( AppException $ge )
        {
            self::jsonOut( $ge->getCode() , $ge->getMessage() , $_GET['con'] . '.' . $_GET['act'] , array() , $ge->getTraceAsString() );
        }
        catch( Exception $e )
        {
            self::jsonOut( $e->getCode() , $e->getMessage() , $_GET['con'] . '.' . $_GET['act'] , array() , $e->getTraceAsString() );
        }
    }

    /**
     * 初始化
     */
    public static function ini()
    {
        //报错
        error_reporting( ( isset( $_GET['err'] ) && DEBUG ) ? ( E_ALL ^ E_NOTICE ) : 0 );

        //自动转义
    	$magic_quotes_gpc = get_magic_quotes_gpc();

    	//去除转义符 防止解析JSON出错
    	if( $magic_quotes_gpc )
		{
			$_POST['data'] = stripslashes( $_POST['data'] );
		}

        //初始化数据
        $_POST = json_decode( $_POST['data'] , true );

        if( !is_array( $_POST ) )
        {
        	$_POST = array();

        	//DEBUG下可使用GET中的DATA
        	if( DEBUG && $_GET['data'] )
        	{
        		//去除转义符 防止解析JSON出错
		    	if( $magic_quotes_gpc )
				{
					$_GET['data'] = stripslashes( $_GET['data'] );
				}
        		$_POST = json_decode( $_GET['data'] , true );
        	}
        }
    }

    /**
     * 验证@TODO:
     *
     * @return int
     */
    public static function auth()
    {
        return (int)$_GET['uId'];
    }

    /**
     * 执行
     *
     * @return string
     */
    public static function run( $userId )
    {
        $con = 'CronController';
        $act = 'processAsyncQueue';

        $conFile = CON_DIR . "{$con}.php";

        if( file_exists( $conFile ) )
        {
            include $conFile;
            $object = new $con;
            if( method_exists( $object , $act ) )
            {
                $object->setUserId( $userId );
                $data = & $object->$act();

                //返回信息
                return array
                (
                    'result' => 0 ,
                    'msg' => '' ,
                    'method' => $con . '.' . $act,
                    'data' => $data
                );
            }
        }

        throw new AppException( 404 , "{$con}/{$act}" );
    }

    /**
     * 按JSON格式 输出
     *
     * @param string $result
     * @param string $msg
     * @param string $method
     * @param array $info
     * @param array $trace
     */
    private static function jsonOut( $result = '' , $msg = '' , $method = ''  , $info = array() , $trace = array() )
    {
        $outputJson = array(
            'result' => $result ,
            'msg' => $msg ,
            'trace' => array() ,
            'method' => $method ,
            'data' => $info ,
        );

        //测试环境输出异常跟踪信息
        if( DEBUG && !empty( $trace ) )
        {
            $outputJson['trace'] = $trace;
        }

        echo json_encode( $outputJson );
    }
}